home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / magazyn_amiga / 5 / ami043_kurs_arexx.txt < prev    next >
Text File  |  1997-09-16  |  12KB  |  523 lines

  1. AREXX (3)
  2.  
  3. <lead>Dzisiaj, zgodnie z obietnicâ, zajmiemy sië popularnymi
  4. playerami do moduîów. Postanowiîem opisaê tylko jeden z nich --
  5. HippoPlayer w wersji 2.0. Mój wybór padî na HippoPlayer dlatego,
  6. ûe program ten dziaîa na kaûdej Amidze, nawet na systemie 1.2, na
  7. A500 z "poîówkami". Takûe na tej konfiguracji dostëpny jest port
  8. ARexxa w tym programie -- potrzebny jest tylko RexxMast i
  9. odpowiednie biblioteki.
  10.  
  11. <a>LeMUr/Fire & blabla
  12.  
  13. <txt>Na poczâtek jednak czëôê teoretyczna, czyli peîna lista
  14. rozkazów ARexxa, które rozpoznaje nasz grajek. Parametry w
  15. nawiasach ostrych ("<" i ">") sâ konieczne, a te w nawiasach
  16. kwadratowych ("[" i "]") moûna pominâê.
  17.  
  18. <r>
  19. CHOOSE <num> -- wybranie moduîu numer "num" z listy.
  20.  
  21. ADD [file] -- dodanie pliku "file" do listy. Jeôli nie podamy nazwy,
  22. to zostanie otwarty requester plików.
  23.  
  24. DEL -- skasowanie wybranego pliku z listy.
  25.  
  26. CLEAR -- wyczyszczenie listy moduîów.
  27.  
  28. MOVE <num> -- przesuniëcie wybranego moduîu za moduî numer "num".
  29.  
  30. INSERT <file> -- wstawienie pliku "file" za wybranym moduîem.
  31.  
  32. SORT -- sortowanie listy moduîów.
  33.  
  34. LOADPRG [file] -- zaîadowanie programu (listy moduîów) o nazwie
  35. "file"; jeôli nie podamy nazwy, to zostanie otwarty requester plików.
  36.  
  37. PLAY [file] -- wyczyszczenie listy i zaîadowanie pliku "file"
  38. oraz odegranie go. Jeôli nie podamy nazwy, to trzeba plik wybraê
  39. z requestera.
  40.  
  41. EJECT -- przerwanie odtwarzania granego moduîu.
  42.  
  43. STOP -- przerwanie odgrywania moduîów.
  44.  
  45. CONT -- wznowienie odgrywania zatrzymanego przez STOP.
  46.  
  47. PLAYSONG <num> -- odegranie "songu" numer "num".
  48.  
  49. RANDPLAY -- wybranie losowego moduîu z listy i odegranie go.
  50.  
  51. FFWD -- "przewiniëcie" moduîu do przodu.
  52.  
  53. REW -- przewiniëcie do tyîu.
  54.  
  55. VOLUME <vol> -- ustawienie gîoônoôci na "vol" w zakresie 0-64.
  56.  
  57. QUIT -- zamkniëcie wszystkich okien i wyjôcie z programu.
  58.  
  59. ZIP <0/1> -- 0: zmniejszenie gîównego okna, 1: normalne rozmiary
  60. tego okna.
  61.  
  62. HIDE <0/1> -- 0: ukrycie gîównego okna, 1: pokazanie go.
  63.  
  64. PUBSCREEN <screen> -- wszystkie okna i requestery majâ sië pojawiaê
  65. na wskazanym ekranie publicznym (waûna wielkoôê liter!).
  66.  
  67. TIMEOUT <secs> -- moduî ma byê odgrywany maksymalnie "secs"
  68. sekund (zakres 0-600).
  69.  
  70. PS3MBOOST <value> -- "podbicie" gîoônoôci w trybie PS3M (zakres 0-8).
  71.  
  72. PS3MMODE <mode> -- tryb PS3M: 1 -- surround, 2 -- stereo, 3 -- mono,
  73. 4 -- real surround, 5 -- 14-bitowe stereo.
  74.  
  75. PS3MRATE <rate> -- wartoôê "próbkowania" PS3M (zakres 5000-56000, w
  76. hercach).
  77.  
  78. LOADPREFS <file> -- wgranie nowych preferencji programu.
  79. HippoPlayer zgrywa preferencje do pliku "S:HippoPlayer.prefs",
  80. wiëc najpierw trzeba "rëcznie" skopiowaê plik z innymi
  81. preferencjami niû standardowe (jeûeli jest nam to potrzebne).
  82.  
  83. GET <xxxx> -- pobranie informacji; "xxxx" ma nastëpujâce znaczenie:
  84.  
  85. PLAY  -- 0, jeôli nic nie jest odgrywane; 1, jeôli coô "gra".
  86.  
  87. CFIL  -- numer wybranego pliku lub 0, gdy nic nie jest wybrane.
  88.  
  89. NFIL  -- liczba plików w liôcie.
  90.  
  91. CURR  -- numer na liôcie aktualnie granego moduîu.
  92.  
  93. NAME  -- nazwa moduîu.
  94.  
  95. TYPE  -- typ moduîu.
  96.  
  97. CNAM  -- nazwa wybranego pliku.
  98.  
  99. CSNG  -- numer aktualnego "songu".
  100.  
  101. NSNG  -- liczba "songów" w module.
  102.  
  103. CSPO  -- pozycja "songu".
  104.  
  105. MSPO  -- maksymalna pozycja "songu".
  106.  
  107. FNAM  -- peîna nazwa granego pliku.
  108.  
  109. COMM  -- komentarz do granego pliku.
  110.  
  111. SIZE  -- rozmiar odgrywanego pliku.
  112.  
  113. <txt>Jest tego trochë -- bëdzie co omawiaê. Port programu nosi
  114. nazwë HIPPOPLAYER, a jest zakîadany wtedy, gdy zainstalowany
  115. (uruchomiony) jest RexxMast. My, korzystajâc z ARexxa na co
  116. dzieï, nie musimy sië tym przejmowaê. Zgodnie z tym, co
  117. napisaîem w czëôci pierwszej, RexxMast jest uruchamiany przy
  118. kaûdym starcie systemu (jeûeli sobie to zapewnimy dopisujâc
  119. odpowiedniâ linië do user-startup lub przeciâgajâc ikonkë
  120. RexxMast do szuflady WBStartup).
  121.  
  122. Spróbujmy napisaê skrypt, podajâcy informacje o odgrywanym
  123. module. Oto on:
  124.  
  125. <l>
  126. /*
  127.  
  128.     Co_gramy.hip
  129.  
  130. */
  131.  
  132.  
  133.  
  134. ADDRESS 'HIPPOPLAYER'
  135.  
  136. OPTIONS RESULTS
  137.  
  138.  
  139.  
  140. /* sprawdzamy, czy coô jest grane */
  141.  
  142. Get PLAY
  143.  
  144. IF RESULT==0 THEN
  145.  
  146. DO
  147.  
  148.     SAY "Nic nie gram, wiëc nie ma o czym mówiê!"
  149.  
  150.     EXIT
  151.  
  152. END
  153.  
  154.  
  155.  
  156. /* teraz pobieramy interesujâce nas nazwy */
  157.  
  158. Get NAME
  159.  
  160. Nazwa=RESULT
  161.  
  162. Get FNAM
  163.  
  164. Plik=RESULT
  165.  
  166. SAY 'Odgrywam moduî "' || Nazwa || '",'
  167.  
  168. SAY 'który jest plikiem "' || Plik || '"'
  169.  
  170.  
  171.  
  172. /* sprawdzamy rozszerzenie pliku */
  173.  
  174. Len=Length(Plik)
  175.  
  176. DO i=Len TO 1 BY -1 WHILE i>0
  177.  
  178.     IF(Substr(Plik,i,1)='.') THEN
  179.  
  180.         BREAK
  181.  
  182.  
  183.  
  184. IF (i=0) THEN
  185.  
  186.     Ext=''
  187.  
  188. ELSE
  189.  
  190.     Ext=Substr(Plik,i,Len)
  191.  
  192.  
  193.  
  194. /* sprawdzamy, czy plik jest spakowany */
  195.  
  196. IF (Ext='pp' | Ext='xpk') THEN
  197.  
  198.     Pack=' (po rozpakowaniu).'
  199.  
  200. ELSE
  201.  
  202.     Pack='.'
  203.  
  204. END
  205.  
  206.  
  207.  
  208. /* jak duûy jest plik? */
  209.  
  210. Get SIZE
  211.  
  212. SAY "Plik ten ma " || RESULT || " bajtów" || Pack
  213.  
  214.  
  215.  
  216. /* co to za moduî? */
  217.  
  218. Get TYPE
  219.  
  220. SAY 'Jest to moduî typu "' || RESULT || '"'
  221.  
  222. EXIT
  223.  
  224. <txt>Na poczâtek standardowo -- kierujemy wszystko do portu
  225. HippoPlayera i ûâdamy, aby zwracane byîy informacje. Na wstëpie
  226. sprawdzamy, czy w ogóle coô jest grane -- jeôli nie, to nie ma
  227. sensu sprawdzaê innych informacji, wiëc koïczymy program. Jeôli
  228. natomiast "coô" jest odgrywane, to podajemy informacje o module
  229. -- najpierw jego nazwë, a potem peînâ nazwë pliku -- wszystko
  230. zgodnie z powyûszym opisem funkcji. Rozkaz SAY jest rozkazem
  231. samego ARexxa i powoduje wyprowadzenie ciâgu na ekran (coô w
  232. rodzaju BASIC-owego PRINT) -- to tak dla przypomnienia.
  233.  
  234. Dalsza czëôê jest juû bardziej skomplikowana -- szukamy
  235. rozszerzenia pliku. Jest to rozwiâzane w bardzo prosty sposób --
  236. "maszerujemy" od koïca nazwy pliku i sprawdzamy kaûdy znak. Jeôli
  237. znak ten jest kropkâ ("."), to przerywamy sprawdzanie. Przerwanie
  238. to powoduje wewnëtrzny rozkaz ARexxa -- BREAK. Linië
  239.  
  240. <l>DO i=Len TO 1 BY -1 WHILE i>0
  241.  
  242. <txt>moûna przetîumaczyê jako "zmniejszaj i od Len co 1, dopóki i
  243. jest wiëksze od zera". Myôlë, ûe jest to jasne. To rozwiâzanie
  244. daje nam pewnoôê, ûe zostanâ sprawdzone wszystkie znaki,
  245. podâûajâc od koïca nazwy. Po znalezieniu kropki kopiujemy
  246. rozszerzenie do zmiennej "Ext" i sprawdzamy, czy jest ona równa
  247. "pp" lub "xpk" -- dwóm najpopularniejszym rozszerzeniom
  248. spakowanych danych (jeôli ktoô chce, to moûe dodaê swoje wîasne
  249. rozszerzenia, np. "crm"). Jeôli natomiast nie jest to ûadne z
  250. tych rozszerzeï (jeôli plik nosi nazwë "mod.moduî" i nie jest
  251. spakowany, to w zmiennej Ext znajdziemy... "moduî", a nie o to
  252. nam przecieû chodzi), to zmiennej Pack podporzâdkowujemy kropkë.
  253. Jeôli jest inaczej -- napis "(po rozpakowaniu)". Nastëpnie
  254. powracamy do obsîugi HippoPlayera -- sprawdzamy rozmiar pliku i
  255. typ moduîu. Wyprowadzamy oczywiôcie te dane na ekran.
  256.  
  257. Spróbujcie przerobiê ten skrypt tak, aby dane zamiast do okna
  258. konsoli (np. okna CLI/Shell) zostaîy dopisane do tekstu w
  259. Cygnusie. Dla uîatwienia podam przykîad wstawienia do tekstu
  260. nazwy odtwarzanego moduîu:
  261.  
  262. <l>
  263. /*
  264.  
  265.     Do_Cygnusa.hip
  266.  
  267. */
  268.  
  269.  
  270.  
  271. ADDRESS 'HIPPOPLAYER'
  272.  
  273. OPTIONS RESULTS
  274.  
  275.  
  276.  
  277. /* pobranie nazwy moduîu */
  278.  
  279. Get NAME
  280.  
  281. Nazwa=RESULT
  282.  
  283.  
  284.  
  285. /* "przeîâczenie" sië na Cygnusa */
  286.  
  287. ADDRESS 'rexx_ced'
  288.  
  289.  
  290.  
  291. /* wypisanie nazwy moduîu */
  292.  
  293. TEXT Nazwa
  294.  
  295. EXIT
  296.  
  297. <txt>Myôlë, ûe nie trzeba dîugo objaôniaê. Najpierw odczytujemy
  298. potrzebne nam dane z HPlayera i przechowujemy je w zmiennych, a
  299. potem kierujemy sië do Cygnusa i "przepisujemy" zmienne do
  300. tekstu.
  301.  
  302. Czas na wiëkszy skrypt. Tym razem "coô", co pozwala na wczytanie
  303. wszystkich moduîów na listë z podanego katalogu (i ewentualnych
  304. podkatalogów), posortowanie tej listy, a nastëpnie odegranie
  305. moduîów.
  306.  
  307. <l>
  308. /*
  309.  
  310.     PlayHippo.rexx
  311.  
  312. */
  313.  
  314.  
  315.  
  316. PARSE ARG name
  317.  
  318.  
  319.  
  320. /* sprawdzenie parametrów */
  321.  
  322. IF name=='' THEN
  323.  
  324. DO
  325.  
  326.     SAY 'Wymagam jednego parametru - nazwy katalogu'
  327.  
  328.     EXIT
  329.  
  330. END
  331.  
  332.  
  333.  
  334. /* "wyczyszczenie" listy */
  335.  
  336. ADDRESS 'HIPPOPLAYER'
  337.  
  338. Stop
  339.  
  340. Clear
  341.  
  342.  
  343.  
  344. /* stworzenie pliku pomocniczego */
  345.  
  346. ADDRESS COMMAND "C:List >T:Temp-dir" || name || "LFORMAT %F%S ALL"
  347.  
  348. i=0
  349.  
  350.  
  351.  
  352. CALL OPEN in,"T:Temp-dir",READ
  353.  
  354. DO FOREVER
  355.  
  356.     i=i+1
  357.  
  358.     mod.i=READLN(in)
  359.  
  360.     IF EOF(in)==1 THEN
  361.  
  362.         BREAK
  363.  
  364. END
  365.  
  366. CALL CLOSE in
  367.  
  368.  
  369.  
  370. ADDRESS COMMAND "C:Delete >NIL: T:Temp-dir"
  371.  
  372.  
  373.  
  374. ADDRESS 'HIPPOPLAYER'
  375.  
  376.  
  377.  
  378. /* dodawanie moduîów do listy */
  379.  
  380. DO a=1 TO i-1
  381.  
  382.     Add mod.a
  383.  
  384. END
  385.  
  386.  
  387.  
  388. /* sortowanie listy */
  389.  
  390. Sort
  391.  
  392.  
  393.  
  394. /* odegranie pierwszego moduîu */
  395.  
  396. Choose 1
  397.  
  398. Play
  399.  
  400. EXIT
  401.  
  402.  
  403. <txt>Jest to skrypt, który wymaga podania parametru -- katalogu, z
  404. którego chcemy odgrywaê moduîy. Aby pobraê jakâô wartoôê
  405. przekazanâ jako parametr, naleûy uûyê PARSE ARG. Sam rozkaz PARSE
  406. jest bardzo rozbudowany i moûe poôwiëcë mu jeden z odcinków -- na
  407. razie wystarczy wiedzieê, ûe "PARSE ARG arg1 arg2 ..." powoduje
  408. zapisanie kolejnych parametrów w zmiennych arg1, arg2 itd.
  409.  
  410. Po pobraniu parametrów sprawdzamy, czy w ogóle jakieô sâ (ARexx
  411. przekaûe pusty ciâg do zmiennej, jeôli nie podamy parametru).
  412. Jeôli nie ma, to wychodzimy ze skryptu. Jeûeli natomiast
  413. podaliômy jakâô nazwë, to zatrzymujemy moduî w HippoPlayerze i
  414. czyôcimy listë. Nastëpnie tworzymy plik pomocniczy, w którym
  415. zostajâ zapisane nazwy plików z wybranego przez nas katalogu.
  416. Pomocna jest tutaj komenda AmigaDOS-u C:LIST, której opis moûna
  417. znaleúê w cyklu "System na talerzu".
  418.  
  419. Po "wylistowaniu" katalogu pozostaje tylko zapamiëtaê wszystkie
  420. nazwy i przekazaê je do HippoPlayera. Wykorzystujemy do tego
  421. tablice. W ARexxie nie ma ograniczenia wielkoôci tablic, nie
  422. trzeba ich teû deklarowaê. Wystarczy, ûe zapiszemy coô do n-tego
  423. elementu tablicy tab przez "tab.n" i to coô juû tam bëdzie. W
  424. naszym skrypcie zapisujemy do tablicy "mod" nazwy kolejnych
  425. moduîów (konkretnie -- nazwy plików). Jeôli napotkamy przy
  426. czytaniu (funkcja ARexxa READLN()) na koniec pliku (jeûeli jest
  427. to prawdâ, to funkcja ARexxa EOF() zwróci nam wartoôê 1), to
  428. przerywamy uzupeînianie tablicy. Kasujemy teû plik pomocniczy.
  429. Potem zwracamy sië znowu do HippoPlayera i przepisujemy dane z
  430. tablicy "mod" do listy moduîów. Na koniec sortujemy caîâ listë,
  431. ustawiamy sië na pierwszym module i zaczynamy koncert!
  432.  
  433. Powyûszy skrypt ma jednak wadë -- jeôli w danym katalogu znajdzie
  434. sië podkatalog, to jego nazwa takûe zostanie dopisana do listy.
  435. HippoPlayer przy próbie wczytania tego "pliku" (bëdzie to
  436. oczywiôcie niemoûliwe -- jak wczytaê katalog?) zasygnalizuje
  437. bîâd, lecz odtwarzanie listy bëdzie trwaîo nadal. Jeôli w tym
  438. katalogu znajdâ sië jakieô moduîy (lub inne pliki -- skrypt nie
  439. sprawdza, czy ma do czynienia z moduîem!), to one takûe zostanâ
  440. doîâczone do listy. Moûna to zmieniê, usuwajâc opcjë ALL w
  441. wywoîaniu "C:List".
  442.  
  443. Jako pracë domowâ proponujë rozbudowë skryptu "PlayHippo.rexx".
  444. Dodajcie sprawdzanie, czy HippoPlayer jest uruchomiony i
  445. ewentualnie uruchomcie go (przydatny bëdzie pierwszy odcinek
  446. tego kursu...).  Po takiej zmianie warto dodaê atrybut "S(cript)"
  447. do pliku i umieôciê go w katalogu REXX:. Pozwoli to na îatwe
  448. odtwarzanie caîych katalogów z moduîami -- wystarczy w CLI/Shell
  449. wpisaê np. "PlayHippo.rexx DH2:Mods".
  450.  
  451. I jeszcze jeden skrypt -- tym razem nie zwiâzany z HippoPlayerem.
  452. Jest to skrypt liczâcy sumë liczb, zapisanych w pliku tekstowym.
  453. Przyda sië osobom, które robiâ katalogi zawierajâce dîugoôê
  454. danych. Aby policzyê caîkowitâ dîugoôê tych danych, wystarczy
  455. zapisaê wszystkie liczby w pliku i uruchomiê poniûszy skrypt. Ma
  456. on jednak pewnâ wadë -- ostatnia linia nie moûe byê zakoïczona (w
  457. Cygnusie: kwadrat symbolizujâcy kursor ma byê na koïcu ostatniej
  458. linii, a nie pod niâ, na poczâtku kolejnej).
  459.  
  460. <l>
  461. /*
  462.  
  463.     Suma.rexx
  464.  
  465. */
  466.  
  467.  
  468.  
  469. PARSE ARG nazwa
  470.  
  471.  
  472.  
  473. IF nazwa='' THEN
  474.  
  475.     EXIT
  476.  
  477.  
  478.  
  479. CALL OPEN in,nazwa,READ
  480.  
  481. suma=0
  482.  
  483.  
  484.  
  485. /* liczenie sumy */
  486.  
  487. DO UNTIL EOF(in)
  488.  
  489.     bug=READLN(in)
  490.  
  491.     suma=suma+bug
  492.  
  493. END
  494.  
  495.  
  496.  
  497. CALL CLOSE in
  498.  
  499.  
  500.  
  501. SAY suma
  502.  
  503.  
  504. <txt>Na wstëpie sprawdzamy parametry. Nastëpnie otwieramy wybrany
  505. plik do odczytu. Kolejna sprawa to pëtla "krëcâca" sië tak dîugo,
  506. dopóki nie zostanie osiâgniëty koniec pliku. Jednoczeônie
  507. odczytywane sâ kolejne linie i dodawane sâ ich wartoôci do sumy.
  508. Na koniec zamykamy plik i wyprowadzamy wynik.
  509.  
  510. To wszystko w tym odcinku. W nastëpnym zajmiemy sië... to
  511. niespodzianka!
  512.  
  513.  
  514. <przyp>
  515. Literatura:
  516.  
  517. ARexx Guide 2.0 -- "biblia" ARexxa opisujâca wszystkie jego
  518. funkcje i skîadnië poszczególnych rozkazów jëzyka.
  519.  
  520. Serdecznie dziëkujë Marcinowi Ochockiemu za pomoc w pisaniu
  521. artykuîu.
  522.  
  523.